import Vue from 'vue' //每一个页面都要导入一次
import axios from 'axios'
import vueAxios from 'vue-axios'

import { Toast } from 'vant';
import router from '.././router/index.js'

Vue.use(vueAxios, axios)

Vue.use(Toast);

// 创建自定义实例
const instance = axios.create({
  baseURL: 'http://toutiao.itheima.net/', //设置基地址
  timeout: 10000, //设置网络超时，超过10秒直接作废
  headers: { 'X-Custom-Header': 'foobar' } //自定义请求头
})

// 导入token
import { saveToken, removeToken, getToken } from '../utils/token.js'

// 拦截器
// 添加请求拦截器
instance.interceptors.request.use(
  // 用来添加token
  function (config) {
    // 如果用户有登陆 , 就有token , 所以判断用户有没有token , 有的话就给他带上token
    if (getToken()) {
      // 调用方法 获取返回的对象 , 然后点出token
      config.headers.Authorization = `Bearer ${getToken().token}` // 这里就用短期token就可以了
    }
    // 在发送请求之前做些什么
    return config
  },
  function (error) {
    // 对请求错误做些什么
    return Promise.reject(error)
  }
)

// 添加响应拦截器
instance.interceptors.response.use(
  function (response) {
    // 用来判断返回的错误是不是 401 ,也就是跟token令牌有没有关系呀
    // 对响应数据做点什么
    return response
  },
  async function (error) {
    if (error.response.status === 401) {
      // 如果能进来就是 401错误 , 没有进来就直接滚过去

      if (getToken()) {
        // 如果有token , 说明是token过期,才返回的401

        // 在这里用refresh_token重新发起请求 , 如果返回的是错误 , 说明refresh_token 也过期了 , 直接去登陆
        // 如果没有返回错误 , 则将新得到的token保存下来 , 替换原来的token ,
        // 利用try catch 捕捉异常 ,

        try {
          const tokenRes = await axios({
            url: 'http://toutiao.itheima.net/v1_0/authorizations',
            method: 'put',
            headers: {
              // 调用方法 获取返回的对象 , 然后点出token                    // 因为之前请求拦截的时候已经发过一次短期token了,所以这次得是
              Authorization: `Bearer ${getToken().refresh_token}`         //  长期token,如果还不行,说明长期token也过期了
            }
          })

          console.log('更新了token' + tokenRes);
          let newToken = getToken()
          newToken.token = tokenRes.data.data.token
          saveToken(newToken)

          return instance(error.config)     // 我返回值写错了 , 干 , 是crror, 不是crrer ,草 , 我返回值写错了 , 说明我前面的一推都没用了 , 
        } catch(err) {
          // 报错说明refresh 也过期 , 直接去登陆
          Toast.fail('请去登陆!')
          removeToken()
          router.push({path:"/login"})
        }
        
           
        
            
      } else {
        // 没有token , 说明没有登陆导致的401 , 直接去登陆

        router.push({ psth: '/login' })
      }
    } else {
      //什么都不管就可以了
    }

    // 对响应错误做点什么
    return Promise.reject(error)
  }
)

export default instance
